package com.dongfang.apad.util;

import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.WindowManager;

/**
 * An API 11+ implementation of {@link SystemUiHider}. Uses APIs available in
 * Honeycomb and later (specifically {@link View#setSystemUiVisibility(int)}) to
 * show and hide the system UI.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class SystemUiHiderHoneycomb extends SystemUiHiderBase {
	/**
	 * Flags for {@link View#setSystemUiVisibility(int)} to use when showing the
	 * system UI.
	 */
	private int		mShowFlags;

	/**
	 * Flags for {@link View#setSystemUiVisibility(int)} to use when hiding the
	 * system UI.
	 */
	private int		mHideFlags;

	/**
	 * Flags to test against the first parameter in
	 * {@link android.view.View.OnSystemUiVisibilityChangeListener#onSystemUiVisibilityChange(int)}
	 * to determine the system UI visibility state.
	 */
	private int		mTestFlags;

	/**
	 * Whether or not the system UI is currently visible. This is cached from
	 * {@link android.view.View.OnSystemUiVisibilityChangeListener}.
	 */
	private boolean	mVisible	= true;

	/**
	 * Constructor not intended to be called by clients. Use
	 * {@link SystemUiHider#getInstance} to obtain an instance.
	 */
	protected SystemUiHiderHoneycomb(Activity activity, View anchorView, int flags) {
		super(activity, anchorView, flags);

		mShowFlags = View.SYSTEM_UI_FLAG_VISIBLE;
		mHideFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
		mTestFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE;

		if ((mFlags & FLAG_FULLSCREEN) != 0) {
			// If the client requested fullscreen, add flags relevant to hiding
			// the status bar. Note that some of these constants are new as of
			// API 16 (Jelly Bean). It is safe to use them, as they are inlined
			// at compile-time and do nothing on pre-Jelly Bean devices.
			mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
			mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN;
		}

		if ((mFlags & FLAG_HIDE_NAVIGATION) != 0) {
			// If the client requested hiding navigation, add relevant flags.
			mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
			mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
			mTestFlags |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
		}
	}

	/** {@inheritDoc} */
	@Override
	public void setup() {
		mAnchorView.setOnSystemUiVisibilityChangeListener(mSystemUiVisibilityChangeListener);
	}

	/** {@inheritDoc} */
	@Override
	public void hide() {
		mAnchorView.setSystemUiVisibility(mHideFlags);
	}

	/** {@inheritDoc} */
	@Override
	public void show() {
		mAnchorView.setSystemUiVisibility(mShowFlags);
	}

	/** {@inheritDoc} */
	@Override
	public boolean isVisible() {
		return mVisible;
	}

	private View.OnSystemUiVisibilityChangeListener	mSystemUiVisibilityChangeListener	= new View.OnSystemUiVisibilityChangeListener() {
																							@Override
																							public void onSystemUiVisibilityChange(
																									int vis) {
																								// Test
																								// against
																								// mTestFlags
																								// to
																								// see
																								// if
																								// the
																								// system
																								// UI
																								// is
																								// visible.
																								if ((vis & mTestFlags) != 0) {
																									if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
																										// Pre-Jelly
																										// Bean,
																										// we
																										// must
																										// manually
																										// hide
																										// the
																										// action
																										// bar
																										// and
																										// use
																										// the
																										// old
																										// window
																										// flags
																										// API.
																										mActivity
																												.getActionBar()
																												.hide();
																										mActivity
																												.getWindow()
																												.setFlags(
																														WindowManager.LayoutParams.FLAG_FULLSCREEN,
																														WindowManager.LayoutParams.FLAG_FULLSCREEN);
																									}

																									// Trigger
																									// the
																									// registered
																									// listener
																									// and
																									// cache
																									// the
																									// visibility
																									// state.
																									mOnVisibilityChangeListener
																											.onVisibilityChange(false);
																									mVisible = false;

																								}
																								else {
																									mAnchorView
																											.setSystemUiVisibility(mShowFlags);
																									if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
																										// Pre-Jelly
																										// Bean,
																										// we
																										// must
																										// manually
																										// show
																										// the
																										// action
																										// bar
																										// and
																										// use
																										// the
																										// old
																										// window
																										// flags
																										// API.
																										mActivity
																												.getActionBar()
																												.show();
																										mActivity
																												.getWindow()
																												.setFlags(
																														0,
																														WindowManager.LayoutParams.FLAG_FULLSCREEN);
																									}

																									// Trigger
																									// the
																									// registered
																									// listener
																									// and
																									// cache
																									// the
																									// visibility
																									// state.
																									mOnVisibilityChangeListener
																											.onVisibilityChange(true);
																									mVisible = true;
																								}
																							}
																						};
}
